package org.stock.agent.service;

import lombok.extern.slf4j.Slf4j;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.MessageWindowChatMemory;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.stereotype.Service;
import org.stock.agent.model.AnalysisResult;
import org.stock.agent.tools.StockTools;

@Service
@Slf4j
public class IndustryAnalyst {

    private final ChatClient openAiChatClient;
    private final ChatModel chatModel;
    private final StockTools stockTools;

    public IndustryAnalyst(ChatModel chatModel, StockTools stockTools) {

        this.chatModel = chatModel;
        this.stockTools = stockTools;

        // 构造时，可以设置 ChatClient 的参数
        // {@link org.springframework.ai.chat.client.ChatClient};
        this.openAiChatClient = ChatClient.builder(chatModel)
                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时，需要指定对话 ID，以便 Spring AI 处理上下文。
                .defaultAdvisors(
                        MessageChatMemoryAdvisor.builder(MessageWindowChatMemory.builder().build()).build()
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(
                        new SimpleLoggerAdvisor()
                )
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(
                        OpenAiChatOptions.builder()
                                .topP(0.7)
                                .build()
                )
                .build();
    }

    public AnalysisResult analyzeIndustry(String symbol) {
        String prompt = """
            作为价值投资行业分析师，请从长期价值投资的角度全面分析{symbol}公司所在行业的整体状况和前景，特别关注该行业是否具有长期投资价值以及当前是否被市场低估。
            
            你需要使用以下工具获取相关信息进行分析：
            1. 使用getStockBasicInfo获取股票基础信息，包括公司名称、行业分类等
            2. 使用getLatestTransaction获取最近的实时交易数据，了解当前市场表现
            3. 使用getCurrentTime获取当前时间，确保分析的时效性
            4. 使用getFinancialMainIndex获取最新的财务主要指标，了解行业整体财务状况
            5. 使用getBalanceSheet获取最近3年的资产负债表数据，分析行业整体资产负债情况
            6. 使用getIncomeStatement获取最近3年的利润表数据，分析行业整体盈利情况
            7. 使用getCashFlowStatement获取最近3年的现金流量表数据，分析行业整体现金流情况
            8. 使用getCompanyCapital获取公司股本信息，了解行业内公司规模分布
            9. 使用getQuarterlyProfit获取近一年各季度利润数据，分析行业盈利的季节性变化
            10. 使用getQuarterlyCashFlow获取近一年各季度现金流数据，分析行业现金流的季节性变化
            11. 使用getPerformanceForecast获取近年业绩预告数据，了解行业未来发展趋势
            
            请从以下几个维度进行深入分析：
            1. 行业基本情况：
               - 行业定义和范围
               - 行业生命周期阶段（初创期、成长期、成熟期、衰退期），重点关注稳定成长或成熟期行业中被低估的公司
               - 行业市场规模和增长趋势，评估行业长期发展空间
            
            2. 行业竞争格局：
               - 行业内主要竞争者及其市场份额
               - 行业集中度分析，高集中度行业中龙头企业更具投资价值
               - 新进入者威胁分析
               - 替代品威胁分析
               - 供应商议价能力
               - 客户议价能力
            
            3. 行业发展趋势：
               - 技术发展趋势，评估技术变化对行业的影响
               - 消费习惯变化趋势，分析市场需求变化
               - 政策法规影响趋势，评估政策对行业的长期影响
               - 国际化趋势，分析行业在全球市场中的竞争力
            
            4. 行业关键成功因素：
               - 行业内企业成功的关键要素
               - 核心竞争力要求
               - 资源和能力要求
            
            5. 行业风险因素：
               - 政策风险，评估政策变化对行业的潜在影响
               - 市场风险
               - 技术风险
               - 威胁风险
               - 周期性风险
               - 汇率风险等
            
            6. 行业盈利能力分析：
               - 行业平均利润率水平，寻找盈利能力稳定的行业
               - 盈利模式分析
               - 成本结构分析
            
            7. 行业估值水平分析：
               - 当前行业整体估值水平，寻找被低估的行业
               - 行业估值历史对比，识别低估时点
               - 与市场整体估值对比，评估相对吸引力
            
            8. 公司在行业中的地位：
               - 市场份额和排名，重点关注行业龙头或细分领域龙头
               - 竞争优势分析，评估公司是否具备持续竞争优势
               - 与同行的对比分析，寻找行业中被低估的优质公司
            
            结合以上分析，评估该行业是否具有长期投资价值，
            以及该股票是否为行业中具有长期投资潜力的优质公司，
            并判断当前是否为投资该行业的良好时机，
            给出适合作为长期价值投资标的的可能性百分比（0-100）和详细的理由分析。
            
            特别注意：
            - 分析行业整体趋势与公司个体发展的关系
            - 识别行业中的机会和威胁
            - 考虑行业周期性对估值的影响
            - 关注政策变化对行业的潜在影响
            - 重点关注稳定行业中的优质公司或成长行业中的低估公司
            
            请严格按照以下JSON格式返回结果：
            {
              "analystRole": "价值投资行业分析师",
              "symbol": "{symbol}",
              "probability": [0-100之间的数值，表示适合作为长期价值投资标的的概率],
              "reasoning": "[详细的行业分析理由，至少包含400字，涵盖上述分析维度，特别说明该股票是否适合长期价值投资]",
              "confidenceLevel": "[高/中/低，基于数据质量和分析确定性]"
            }
            """;

        AnalysisResult entity = openAiChatClient.prompt(prompt + "symbol是" + symbol)
                .tools(stockTools)
                .call()
                .entity(AnalysisResult.class);
        log.info("价值投资行业分析师: {}", entity.getReasoning());
        return entity;
    }
}